home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE5f.s < prev    next >
Text File  |  1994-07-06  |  6KB  |  184 lines

  1.  
  2. ; Lezione5f.s    EFFETTO "SCIOGLIMENTO" O "FLOOD" FATTO CON I MODULI NEGATIVI
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. Inizio:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  9.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  10.     jsr    -$198(a6)    ; OpenLibrary
  11.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  12.     move.l    d0,a6
  13.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist vecchia
  14.  
  15. ;     PUNTIAMO I NOSTRI BITPLANES
  16.  
  17.     MOVE.L    #PIC,d0        ; in d0 mettiamo l'indirizzo della PIC,
  18.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  19.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  20. POINTBP:
  21.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  22.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  23.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  24.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  25.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  26.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  27.     dbra    d1,POINTBP    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  28. ;
  29.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  30.     move.w    d0,$dff088        ; Facciamo partire la COP
  31.     move.w    #0,$dff1fc        ; Disattiva l'AGA
  32.     move.w    #$c00,$dff106        ; Disattiva l'AGA
  33.  
  34. mouse:
  35.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  36.     bne.s    mouse        ; Se non ancora, non andare avanti
  37.  
  38.     btst    #2,$dff016    ; se il tasto destro e' premuto salta
  39.     beq.s    Aspetta        ; la routine dello scroll, bloccandolo
  40.  
  41.     bsr.w    Flood        ; Muove in alto e in basso un wait seguito
  42.                 ; da un modulo -40, che causa l'effetto FLOOD
  43.  
  44. Aspetta:
  45.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  46.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta!
  47.  
  48.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  49.     bne.s    mouse        ; se no, torna a mouse:
  50.  
  51.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  52.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  53.  
  54.     move.l    4.w,a6
  55.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  56.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  57.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  58.     rts            ; USCITA DAL PROGRAMMA
  59.  
  60. ;    Dati
  61.  
  62. GfxName:
  63.     dc.b    "graphics.library",0,0    
  64.  
  65. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  66.     dc.l    0    ; della graphics.library
  67.  
  68. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  69.     dc.l    0
  70.  
  71. ; Effetto definibile come "Metallo fuso", ottenuto con i moduli -40
  72.  
  73. Flood:
  74.     TST.B    SuGiu        ; Dobbiamo salire o scendere?
  75.     beq.w    VAIGIU
  76.     cmp.b    #$30,FWAIT    ; siamo arrivati abbastanza in ALTO?
  77.     beq.s    MettiGiu    ; se si, siamo in cima e dobbiamo scendere
  78.     subq.b    #1,FWAIT    ; scorriamo in ALTO
  79.     rts
  80.  
  81. MettiGiu:
  82.     clr.b    SuGiu        ; Azzerando SuGiu, al TST.B SuGiu il BEQ
  83.     rts
  84.  
  85. VAIGIU:
  86.     cmp.b    #$f0,FWAIT    ; siamo arrivati abbastanza in BASSO?
  87.     beq.s    MettiSu        ; se si, siamo in fondo e dobbiamo risalire
  88.     addq.b    #1,FWAIT    ; scorriamo in ALTO
  89.     rts
  90.  
  91. MettiSu:
  92.     move.b    #$ff,SuGiu    ; Quando la label SuGiu non e' a zero,
  93.     rts            ; significa che dobbiamo risalire.
  94.  
  95.  
  96. ;    Questo byte, indicato dalla label SuGiu, e' un FLAG.
  97.  
  98. SuGiu:
  99.     dc.b    0,0
  100.  
  101.  
  102.     SECTION    GRAPHIC,DATA_C
  103.  
  104. COPPERLIST:
  105.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  106.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  107.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  108.     dc.w    $13e,$0000
  109.  
  110.     dc.w    $8e,$2c81    ; DiwStrt    (registri con valori normali)
  111.     dc.w    $90,$2cc1    ; DiwStop
  112.     dc.w    $92,$0038    ; DdfStart
  113.     dc.w    $94,$00d0    ; DdfStop
  114.     dc.w    $102,0        ; BplCon1
  115.     dc.w    $104,0        ; BplCon2
  116.     dc.w    $108,0        ; Bpl1Mod
  117.     dc.w    $10a,0        ; Bpl2Mod
  118.  
  119.             ; 5432109876543210
  120.     dc.w    $100,%0011001000000000    ; bits 13 e 12 accesi!! (3 = %011)
  121.                     ; 3 bitplanes lowres, non lace
  122. BPLPOINTERS:
  123.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  124.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane
  125.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane
  126.  
  127.     dc.w    $0180,$000    ; color0
  128.     dc.w    $0182,$475    ; color1
  129.     dc.w    $0184,$fff    ; color2
  130.     dc.w    $0186,$ccc    ; color3
  131.     dc.w    $0188,$999    ; color4
  132.     dc.w    $018a,$232    ; color5
  133.     dc.w    $018c,$777    ; color6
  134.     dc.w    $018e,$444    ; color7
  135.  
  136. FWAIT:
  137.     dc.w    $3007,$FFFE    ; WAIT che precede il modulo negativo
  138.     dc.w    $108,-40
  139.     dc.w    $10a,-40
  140.  
  141.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  142.  
  143. ;    figura
  144.  
  145. PIC:
  146.     incbin    "amiga.320*256*3"    ; qua carichiamo la figura in RAW,
  147.                     ; convertita col KEFCON, fatta di
  148.                     ; 3 bitplanes consecutivi
  149.  
  150.     end
  151.  
  152. Da notare che -40 viene assemblato come $ffd8 (provate con un "?-40").
  153. Provate a bloccare col tasto destro la routine e verificherete che avviene un
  154. "allungamento" dell'ultima riga fino alla fine dello schermo.
  155. Abbiamo verificato che con un modulo negativo di -40 il copper non avanza,
  156. infatti va avanti di 40 e torna indietro di 40. Ma se mettiamo il modulo a -80,
  157. cosa succede??? Legge alla rovescia!!! infatti legge e visualizza 40 bytes, poi
  158. indietreggia di 80 bytes, andando all'inizio della linea precedente, che viene
  159. visualizzata, dopodiche' salta alla linea precedente eccetera. Questo sistema
  160. e' il piu' usato per gli effetti SPECCHIO tanto frequenti sull'Amiga proprio
  161. perche' basta mettere un paio di istruzioni copper:
  162.  
  163.     dc.w    $108,-80
  164.     dc.w    $10a,-80
  165.  
  166. provate a cambiare i due -40 dei moduli in questo esempio in due -80, e lo
  167. "SPECCHIO" apparira', anche se stavolta il problema e' che viene visualizzato
  168. anche qualcosa che sta sopra la figura (procedendo all'indietro).
  169. Una curiosita': noterete che nella prima linea dello "SPORCO" che appare dopo
  170. la figura specchiata c'e' un movimento che interessa dei pixel: si tratta del
  171. wait nella copperlist che cambiamo ogni frame! Infatti cosa c'e' in memoria
  172. prima della nostra figura?? La copperlist!! Dunque procedendo all'indietro
  173. nella lettura (modulo -80), cosa sara' visualizzato?? I byte della copperlist,
  174. poi quello che viene prima.
  175.  
  176. Se aumentiamo la negativita' otterremo specchiature sempre piu' schiacciate,
  177. infatti avviene lo stesso effetto dei moduli positivi, ma al rovescio.
  178.  
  179.     dc.w    $108,-40*3
  180.     dc.w    $10a,-40*3
  181.  
  182. Per la figura rispecchiata dimezzata, eccetera.
  183.  
  184.